/***************************************
 * @Date:2020.11.18
 * @Author:steven
 * @brief:
 * @Detail:
 * @Editor:
 * @Brief:
 * \else
 *
 * @创建日期：2016年11月18日
 * ＠作者：程盼
 * ＠大概功能描述：对xml文件属性节点的数据读写
 * ************************************/

#ifndef XMLPARSE_H
#define XMLPARSE_H

#include <QtXml/QDomDocument>
#include <QtXml/QDomElement>
#include <QtXml/QDomNode>
#include <QtXml/QDomNodeList>
#include <QtXml/QDomProcessingInstruction>

#include <QDebug>
#include <QVariant>
#include <QFile>

class CommunicateNormalDelegate;

class XmlParse
{
public:
    XmlParse();
    ~XmlParse();

public:
    /**
     * @brief openXml     打开xml文件
     * @param fileName     文件名称
     */
    bool openXml(QString fileName);
    /**
     * @brief closeXml
     */
    void closeXml();
    /**
     * @brief closeWriteXml　　　关闭写入的xml文件
     * @param fileName          文件名称
     */
    void closeWriteXml(QString fileName);
    /**
     * @brief closeReadXml      关闭读的xml文件
     */
    void closeReadXml();
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,int elementValue);
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName, double elementValue);
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName, long long elementValue);
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,QVariant elementValue);
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,QString elementValue);
    /**
     * @brief writeXml          写xml文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,float elementValue);

    /**
     * @brief writeXml          写md5值到文件
     * @param robotId           机器人id，若id为-1，则为全局变量，否则为机器人号码
     * @param elementName       文件名
     * @param elementValue      生成的文件的md5值
     * @return
     */
    bool writeXml(int robotId,QString elementName,QString elementValue);

    /**
     * @brief readXml           读xml文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    void readXml(QString elementName,double &number);
    /**
     * @brief readXml           读xml文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    void readXml(QString elementName,int &number);
    /**
     * @brief readXml           读xml文件
     * @param elementName       节点名称
     * @param pwd               节点属性
     */
    void readXml(QString elementName,QString &pwd);
    /**
     * @brief readXml           读xml文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    void readXml(QString elementName,float &number);

    /**
     * @brief addPro            添加属性节点
     * @param proName           节点名称
     * @param proValue          节点属性
     * @return
     */
    bool addPro(QString proName,QString proValue);

    //MD5
    /**
     * @brief addPro            添加MD5属性节点
     * @param robotId           添加id
     * @param elementName
     * @param elementValue
     * @return
     */
    bool addPro(int robotId,QString elementName,QString elementValue);
    /**
     * @brief deletePro         删除节点
     * @param proName           节点名称
     * @return
     */
    bool deletePro(QString proName,int robotId);
    /**
     * @brief getAllProList     获取所有的属性节点
     * @param proNameMap        保存所有属性节点的对象
     */
    void getAllProList(QMap <int,QMap <QString,QString> > &proNameMap);

    //IO
    /**
     * @brief updateIoMap       修改IO注释
     * @param valueType         IO类型 NULL DI DO AI AO SI SO,bug: 偶尔不能识别空行，在末尾增加了多余字符串
     * @param logicValueIndex   IO编号
     * @param message           注释内容
     * @return
     */
    bool updateIoMap(int valueType,int logicValueIndex,QString message);
    /**
     * @brief getAllIoList      获取所有IO列表
     * @param ioList            IO列表内容
     */
    void getAllIoList(QVector < QVector <QString> > &ioList);

    /**
     * @brief findSubNode       查找节点的子节点
     * @param node              子节点
     * @param name              节点名称
     * @return                  后去状态
     */
    QDomNode findSubNode(const QDomNode &node, QString name, bool &ok );

    /**
     * @brief addNode           往某节点添加一个子元素
     * @param pnode             某节点
     * @param nodeName          子元素
     * @param text              子元素de值
     * @return                  子元素
     */
    QDomElement addNode(QDomNode &pnode, QString nodeName, QString val="");

    /**
     * @brief m_doc
     */
    QDomDocument m_doc;

    /**
     * @brief m_root  //主节点
     */
    QDomElement m_root;

    /**
     * @brief file
     */
    QFile *file;
};

#endif // XMLPARSE_H
